#pragma once

#include <jsoncpp/json/json.h>
#include <string>
#include <iostream>
#include <memory>
#include <sstream>
#include "Log.hpp"
namespace jsonrpc
{
    namespace base
    {
        static const std::string &default_encode = "emitUTF8";
        // 默认编码格式为utf-8
        class JsonUtil
        {
        public:
            // 序列化
            static bool Serialization(const Json::Value &root, std::string &out,const std::string& encode = default_encode)
            {
                Json::StreamWriterBuilder build;
                /*设置序列化后的编码格式,根据Jsoncpp版本不同设置，有些版本不需要设置编码*/
                build[encode] = true;
                std::stringstream ss;
                std::unique_ptr<Json::StreamWriter> writer(build.newStreamWriter());
                int ret = writer->write(root, &ss);
                if (ss.fail() || ss.bad())
                {
                    ERROR_LOG("序列化失败,原因:{}\n",ss.str());
                    return false;
                }
                out = ss.str();
                return true;
            }
            //反序列化
            static bool Deserialization(const std::string &val, Json::Value &root,const std::string& encode = default_encode)
            {
                Json::CharReaderBuilder build;
                /*设置序列化后的编码格式,根据Jsoncpp版本不同设置，有些版本不需要设置编码*/
                build[encode] = true;
                std::stringstream ss;
                std::unique_ptr<Json::CharReader> reader(build.newCharReader());
                std::string err;
                bool ok = reader->parse(val.c_str(),val.c_str() + val.size(),&root,&err);
                if (!ok)
                {
                    ERROR_LOG("序列化失败,原因:{}\n",err);
                    return false;
                }
                return true;
            }
        };
    };
}